#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Define the enumeration for roles. Lower integer value means lower priority.
typedef enum {
STUDENT,
TA,
PROFESSOR
} MoodleRole;
// Define the enumeration for degrees. Lower integer value means lower priority.
typedef enum {
SECONDARY,
BACHELOR,
MASTER,
PHD
} Degree;
// Structure to hold a Moodle member's information.
typedef struct {
char name[100];
Degree degree;
MoodleRole role;
} MoodleMember;
// --- Helper functions to convert enums to strings for printing ---
const char* getRoleName(MoodleRole r) {
switch(r) {
case STUDENT: return "Student";
case TA: return "TA";
case PROFESSOR: return "Professor";
default: return "Unknown";
}
}
const char* getDegreeName(Degree d) {
switch(d) {
case SECONDARY: return "Secondary";
case BACHELOR: return "Bachelor";
case MASTER: return "Master";
case PHD: return "PhD";
default: return "Unknown";
}
}
// Comparison function for qsort().
// This function defines the sorting logic.
int compareMembers(const void *a, const void *b) {
MoodleMember *memberA = (MoodleMember *)a;
MoodleMember *memberB = (MoodleMember *)b;
// First, compare by role.
if (memberA->role < memberB->role) return -1;
if (memberA->role > memberB->role) return 1;
// If roles are equal, then compare by degree.
if (memberA->degree < memberB->degree) return -1;
if (memberA->degree > memberB->degree) return 1;
// If both role and degree are equal, they are considered equal in sorting order.
return 0;
}
int main() {
int count;
printf("Enter the number of Moodle members: ");
scanf("%d", &count);
// Dynamically allocate memory for the array of members.
MoodleMember *members = malloc(count * sizeof(MoodleMember));
// Get details for each member.
for (int i = 0; i < count; i++) {
printf("\n--- Member %d ---\n", i + 1);
printf("Name: ");
scanf("%s", members[i].name);
printf("Role (0=Student, 1=TA, 2=Professor): ");
scanf("%u", &members[i].role);
printf("Degree (0=Secondary, 1=Bachelor, 2=Master, 3=PhD): ");
scanf("%u", &members[i].degree);
}
// Sort the array using the standard library's qsort function.
// qsort(array_to_sort, number_of_elements, size_of_each_element, comparison_function);
qsort(members, count, sizeof(MoodleMember), compareMembers);
// Print the sorted list of members.
printf("\n--- Sorted Moodle Members ---\n");
for (int i = 0; i < count; i++) {
printf("Name: %-15s | Role: %-10s | Degree: %-10s\n",
members[i].name,
getRoleName(members[i].role),
getDegreeName(members[i].degree));
}
// Free the dynamically allocated memory.
free(members);
return 0;
}